# Python3 错误和异常
# 语法错误
# Python 的语法错误或者称之为解析错，是初学者经常碰到的，如下实例 if 3>1 缺少冒号
# 异常
# 即便 Python 程序的语法是正确的，在运行它的时候，也有可能发生错误。运行期检测到的错误被称为异常。
# 大多数的异常都不会被程序处理，都以错误信息的形式展现在这里: 例如 TypeError: can only concatenate str (not "int") to str
# 异常以不同的类型出现，这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError，NameError 和 TypeError。
# 错误信息的前面部分显示了异常发生的上下文，并以调用栈的形式显示具体信息。
# 异常处理
# try/except
# 异常捕捉可以使用 try/except 语句。
while True:
    try:
        x = int(input('请输入一个数字'))
        b = 3 / x
        break
    except ValueError:
        print('您输入的不是数字,请再次输入')
    except ZeroDivisionError:
        print('分母不能为0')

# try 语句按照如下方式工作；
# 首先，执行 try 子句（在关键字 try 和关键字 except 之间的语句）。
# 如果没有异常发生，忽略 except 子句，try 子句执行后结束。
# 如果在执行 try 子句的过程中发生了异常，那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符，那么对应的 except 子句将被执行。
# 如果一个异常没有与任何的 except 匹配，那么这个异常将会传递给上层的 try 中。
# 一个 try 语句可能包含多个except子句，分别来处理不同的特定的异常。最多只有一个分支会被执行。
# except()可以忽略异常的名称，它将被当作通配符使用。

# try/except...else
# try/except 语句还有一个可选的 else 子句，如果使用这个子句，那么必须放在所有的 except 子句之后。
# else 子句将在 try 子句没有发生任何异常的时候执行。
# try-finally 语句
# try-finally 语句无论是否发生异常都将执行最后的代码。
# try:
# 执行代码
# except:
# 发生异常时执行的代码
# else:
# 没有异常时执行的代码
# finally:
# 不管有没有异常都会执行的代码
try:
    1 / 0
except Exception as e:
    print(e)
else:
    print('没有异常发生')
finally:
    print('我始终会被执行')

# 抛出异常
# Python 使用 raise 语句抛出一个指定的异常。
x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: ', x)
